中介器(middleware),
是指發送請求(request)後,
到收到回應(response)前,
途中處理各種用途的部分。
舉例來說,你有著幾百個api,
你想要在該api被呼叫時紀錄log,
在沒有MiddleWare的情況下,
你就必須每個api都要加程式碼,
如果有middleware,
你只需要在middleware上動手腳即可。
negroni,不是指調酒,
而是指這款用go開發,輕量化的middleware套件,
這款套件可以跟上一章介紹的mux有效配合,就像下面這樣:
router := mux.NewRouter()
router.HandleFunc("/", HomeHandler)
n := negroni.New(Middleware1, Middleware2)
// Or use a middleware with the Use() function
n.Use(Middleware3)
// router goes last
n.UseHandler(router)
http.ListenAndServe(":3001", n)
上面的是官方範例,可以看到先用mux建立router跟handler,
再來將router物件放入建立出來的middleware物件,就可以產生簡單的middleware了。
以建立好的webserver來說,一個麻煩的地方就是當要收集資料做分析,
或是有bug出現,需要找api被呼叫的紀錄時,
那個api並沒有加上log,導致沒log資料。
對於這種情況,negroni也有提供log相關的功能:
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Welcome to the home page!")
})
n := negroni.New()
n.Use(negroni.NewLogger())
n.UseHandler(mux)
http.ListenAndServe(":3004", n)
跟前面的官方範例類似,只是多一段Use(negroni.NewLogger()),在這邊設定好negroni的logger後
會印出下面的log
[negroni] 2017-10-04T14:56:25+02:00 | 200 | 378µs | localhost:3004 | GET /
對於這個log,也可以去更改他的log格式:
nlogger := negroni.NewLogger()
nlogger.SetFormat("[{{.Status}} {{.Duration}}] - {{.Request.UserAgent}}")
n.Use(nlogger)
這個方式可以將log改成符合你收集格式的樣子,方便之後收集資料。
透過這個套件,我們就可以建好符合自己要求的middleware了,接下來我們要開始探討被呼叫的api要怎麼處理內部行為。